package org.example.core;

import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.example.model.WfDef;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Map;

/**
 * 工作流服务
 *
 * @author wanghuidong
 * @date 2024/7/1 16:12
 */
public interface IWorkFlowService {

    /**
     * 创建工作流并部署
     *
     * @param wfDef 流程定义参数
     * @return 部署ID
     */
    String createWorkflowAndDeploy(WfDef wfDef);

    /**
     * 查询任务
     *
     * @param taskId 任务ID
     * @return 任务
     */
    Task findTask(String taskId);

    /**
     * 查询流程实例
     *
     * @param taskId 任务ID
     * @return 流程实例
     */
    ProcessInstance findFlowInstance(String taskId);

    /**
     * 获取出口节点编号
     *
     * @param taskId 任务ID
     * @return 出口节点编号列表
     */
    List<String> getOutgoingFlows(String taskId);

    /**
     * 完成工作流任务节点
     * 说明：完成任务的那一刻，会触发本任务的complete事件和下一个任务的create事件
     *
     * @param taskId             任务ID
     * @param variables          任务参数
     * @param transientVariables 任务临时参数
     */
    void complete(String taskId, Map<String, Object> variables, Map<String, Object> transientVariables);


    /**
     * 取消工作流
     *
     * @param flowNo       流程编号（businessKey）
     * @param deleteReason 取消原因
     */
    void cancel(@NonNull String flowNo, String deleteReason);

    /**
     * 启动工作流
     *
     * @param flowDefNo 流程定义编号（processDefinitionKey）
     * @param param     流程入参（作用于流程实例）
     * @return 流程编号（businessKey）
     */
    String startFlow(@NonNull String flowDefNo, @Nullable Map<String, Object> param);

    /**
     * 启动工作流（指定流水号）
     *
     * @param flowDefNo 流程定义编号（processDefinitionKey）
     * @param flowNo    流程编号（businessKey）
     * @param param     流程入参（作用于流程实例）
     */
    void startFlow(@NonNull String flowDefNo, @NonNull String flowNo, @Nullable Map<String, Object> param);
}
